/*
 * ==============================================================================
 * ||                  TikTok API 响应终极过滤与安全打印脚本                    ||
 * ==============================================================================
 *
 * 最终策略:
 * 1. 放弃 URL 过滤，直接分析响应体 responseBody。
 * 2. 检查 responseBody 的类型：
 *    - 如果是 String，直接判断内容。
 *    - 如果是 Object，先用安全的方式将其格式化为伪 JSON 字符串，再判断内容。
 * 3. 这种方式可以同时处理两种类型的响应体，并且绝对安全。
 *
 */

console.log("====== 终极过滤脚本已部署，等待目标... ======");

Java.perform(function() {
    console.log("====== Java.perform() 已执行，Hook 已就位。 ======");

    const SsResponse = Java.use("X.DBo");

    // 目标接口响应内容的特征关键词
    const targetKeyword = '"aweme_list"';

    // (之前的 safeFormatObject 函数保持不变，这里省略以保持清爽)
    function safeFormatObject(obj, indent = "  ", visited = new Set()) {
        if (obj === null) { return "null"; }
        if (obj === undefined) { return "undefined"; }
        const obj_class = obj.getClass();
        if (obj_class.isPrimitive() || obj_class.getName().startsWith("java.lang")) {
            if (obj_class.getName() === "java.lang.String") { return `"${obj.toString()}"`; }
            return obj.toString();
        }
        if (visited.has(obj)) { return `"[Circular Reference to ${obj.$className}]"`; }
        visited.add(obj);
        let output = "";
        if (obj_class.isArray()) {
            output += "[\n";
            const len = Java.array('java.lang.Object', obj).length;
            for(let i=0; i<len; i++){
                output += indent + "  " + safeFormatObject(obj[i], indent + "  ", visited);
                if(i < len -1) output += ",";
                output += "\n";
            }
            output += indent + "]";
            return output;
        }
        try {
            const fields = obj_class.getDeclaredFields();
            output += "{\n";
            for (let i = 0; i < fields.length; i++) {
                const field = fields[i];
                field.setAccessible(true);
                const fieldName = field.getName();
                const fieldValue = field.get(obj);
                output += `${indent}  "${fieldName}": ${safeFormatObject(fieldValue, indent + "  ", visited)}`;
                if (i < fields.length - 1) { output += ","; }
                output += "\n";
            }
            output += indent + "}";
            return output;
        } catch (e) {
            return `"[Inspect Error: ${e.message}] -> ${obj.toString()}"`;
        }
    }


    SsResponse.LIZLLL.implementation = function(responseBody, rawResponse) {
        
        const result = this.LIZLLL(responseBody, rawResponse);

        try {
            if (responseBody) {
                let bodyString = "";
                const bodyClassName = responseBody.getClass().getName();

                // 判断 responseBody 的类型
                if (bodyClassName === 'java.lang.String') {
                    // 如果是字符串，直接使用
                    bodyString = responseBody.toString();
                } else {
                    // 如果是对象，用我们的安全函数转换成字符串
                    bodyString = safeFormatObject(responseBody);
                }

                // 统一对转换后的字符串进行内容过滤
                if (bodyString.includes(targetKeyword)) {
                    
                    console.log("\n\n\n" + "===================  TARGET FOUND BY CONTENT  ===================");

                    let url = "[URL not found or failed to read]";
                    if (rawResponse && rawResponse.LIZ && rawResponse.LIZ.value) {
                        url = rawResponse.LIZ.value;
                    }
                    console.log("[*] URL (if available): " + url);
                    console.log("------------------------------------------------------");
                    console.log("[+] Response Body (Formatted):");
                    console.log(bodyString); // 直接打印我们已经处理/格式化好的字符串
                    
                    console.log("===============================================================\n\n\n");
                }
            }
        } catch (e) {
            console.error("[!] Hook 逻辑执行出错: " + e);
        }

        return result;
    };

    console.log("[*] 终极安全过滤 Hook 已激活: X.DBo.LIZLLL");
    console.log("[*] 请在 App 中操作，脚本正在通过内容监听...");
});